-
Notifications
You must be signed in to change notification settings - Fork 21
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Damagucci-Juice] step3 델리게이트 프로토콜로 작동하던 것을 노티피케이션 센터를 이용해서 설정 #90
base: gucci
Are you sure you want to change the base?
[Damagucci-Juice] step3 델리게이트 프로토콜로 작동하던 것을 노티피케이션 센터를 이용해서 설정 #90
Conversation
그걸 찾아내야죠! ㅎㅎ object의 타입은 무엇으로 되어 있던가요?
글쎄요. 좀 광범위한 질문이네요. 항상 질문을 할 때는 본인이 시도한 것, 본인이 작성한 기준을 설명해주면 좋을 것 같습니다. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
전체적으로 잘 구현하셨는데, 몇 가지 의견을 남겼습니다.
NotificationCenter를 다루는 부분들만 수정하고 넘어가면 될 것 같습니다.
|
||
import Foundation | ||
|
||
let notificationCenter = NotificationCenter.default |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
NotificationCenter.default를 이렇게 줄이는 게 썩 좋은 표현이나 접근이 아닙니다.
싱글톤으로 접근하는 NotificationCenter.default 이런 값을 참조해 놓는 것이 좋지 않은 경우도 있습니다. 줄여쓰는 효과가 있는게 아니면 그대로 써도 됩니다.
NotificationCenter는 덜하지만 default가 참조하는 포인터가 바뀌는 경우도 있습니다. 그래서 이렇게 담아놓으면 다른 인스턴스를 가르킬 수도 있습니다. 싱글톤을 쓸 때는 그냥 이걸 쓰는게 더 좋습니다.
extension Notification.Name { | ||
static let addRectangleView = Notification.Name("A rectangle is made") | ||
static let tappedRectangleView = Notification.Name("a rectangle view is Tapped") | ||
static let colorChange = Notification.Name("color changed") | ||
static let alphaChange = Notification.Name("alpha changed") | ||
} | ||
|
||
enum NotificationKey { | ||
case color | ||
case alpha | ||
case tappedRectangle | ||
case addedRectangle |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
노티는 행위에 가깝고, 키는 변수에 가까우니 그런 형태면 좋을 것 같고. 그외에는 겹치지 않는지. 명확한 의도를 전달하는 지 살펴보면 될 것 같습니다.
그리고 상수는 항상 관련있는 타입이 있습니다. 사용하는 타입도 있고, 전송하는 타입도 있죠. 어떤 타입과 관련이 높은지 살펴보고 응집도 높게 합쳐보세요.
DrawingApp/DrawingApp/Plane.swift
Outdated
@@ -31,15 +11,13 @@ class Plane { | |||
func addRectangle() { | |||
let rectangle: Rectangle = Factory.createRandomRectangle() | |||
rectangles.append(rectangle) | |||
|
|||
addedRectangleDelegate?.made(rectangle: rectangle) | |||
notificationCenter.post(name: .addRectangleView, object: nil, userInfo: [NotificationKey.addedRectangle : rectangle]) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
NotificationCenter의 object는 sender의 의미라서 보내는 객체도 항상 지정해주는 게 좋습니다. 그래야 옵저버 조건에서 매칭이 가능합니다
notificationCenter.addObserver(self, selector: #selector(didChangeColor(rectangleNoti:)), name: Notification.Name.colorChange, object: nil) | ||
|
||
// alpha changed | ||
notificationCenter.addObserver(self, selector: #selector(didChangeAlpha(rectangleNoti: )), name: Notification.Name.alphaChange, object: nil) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
옵저버를 등록할 때도 가능하면 object (sender)를 지정해주는 게 좋습니다. 그래야 그 타입이 보내는 그 메시지를 받을 수 있죠.
물론 모든 타입이 보내는 메시지를 받을 때는 생략 가능합니다
activateNotificationObservers() | ||
initDetailView() | ||
touchBackgroundView() | ||
activateBackgroundTappable() | ||
} | ||
|
||
override func viewDidDisappear(_ animated: Bool) { | ||
notificationCenter.removeObserver(self) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
viewDidLoad는 뷰 컨트롤러 생성되고 한 번만 호출되지만, viewDidDisappear는 다른 뷰로 넘어가도 불리고 여러번 불릴 수 있죠.
만약 이렇게 짝을 지으면 다른 뷰 컨트롤로 화면으로 넘어갔다 돌아오면 그 때부터 노티를 못 받습니다. 그래도 될까요?
viewDidDisappear() 처럼 override 하는 함수는 꼭 super.xxx를 호출해주셔야 합니다. 그렇지 않으면 그 상태가 된 다음에 오동작을 할 수 있습니다.
@@ -107,7 +122,11 @@ extension ViewController: RectangleTouchedDelegate { | |||
alphaSlider.value = Float(rect.alpha.rawValue) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
for (key, value) in rectangleAndViewContainer 에서 view로 찾는 것은 좀 이상한데요.
이렇게 찾을꺼면 key를 view로 하는 게 맞는 거구요,
showDetailOfColorAndAlpha()를 어디서 호출하는 지 모르겠지만 view로 찾지 말고 rectangle로 view를 찾는 게 적당합니다.
extension ViewController : RectangleAlaphaChangeDelegate { | ||
func didChangeAlpha(rectangle: Rectangle) { | ||
extension ViewController { | ||
@objc func didChangeAlpha(rectangleNoti: Notification) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
rectangleNoti 는 notification의 이름으로 부정확한 것 같습니다.
사각형태노티(그런게 있는지 모르겠지만)인지, 사각형에 대한 노티인지, 사각형 변화에 대한 노티인지 모르겠습니다.
그럴수록 단어를 억지로 줄여쓰지 않는게 좋습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@objc func didChangeAlpha(from plane: Notification) {
플레인으로 부터 온 노티피케이션이라고 표현을 해보았는데 괜찮을까요?
작업 내용
질문거리
object
부분에 plane 을 넣으면 안되고, nil 을 넣으면 되고 이게 무슨 차이인지 모르겠습니다.부연설명
다마구찌 개인 공부 블로그 에 NotificationCenter 의 아주 기초적인 설정 순서를 정리해두었습니다.
구현화면